package main

import (
    "bytes"
    "fmt"
    "log"
    "os"

    "log/slog" // Go 1.21+ 引入的结构化日志库
)

func main() {

    // 使用 Go 的标准库日志记录器输出一条普通日志
    log.Println("standard logger")

    // 设置标准日志记录器的标志，添加微秒时间戳
    log.SetFlags(log.LstdFlags | log.Lmicroseconds)
    log.Println("with micro") // 输出将包含日期、时间（包括微秒）

    // 设置标准日志记录器的标志，添加文件名和行号
    log.SetFlags(log.LstdFlags | log.Lshortfile)
    log.Println("with file/line") // 输出将包含日期、时间、文件名:行号

    // 创建一个新的日志记录器，输出到 os.Stdout，带有前缀“my:”
    mylog := log.New(os.Stdout, "my:", log.LstdFlags)
    mylog.Println("from mylog") // 输出：my: 时间戳 from mylog

    // 更改 mylog 的前缀
    mylog.SetPrefix("ohmy:")
    mylog.Println("from mylog") // 输出：ohmy: 时间戳 from mylog

    // 创建一个日志记录器，将日志写入内存缓冲区 buf 中，而不是控制台
    var buf bytes.Buffer
    buflog := log.New(&buf, "buf:", log.LstdFlags)
    buflog.Println("hello") // 这条日志被写入 buf，而不是打印出来

    // 从 buf 中读取日志内容并手动打印出来
    fmt.Print("from buflog:", buf.String())

    // 使用结构化日志 slog（Go 1.21+ 新增）
    jsonHandler := slog.NewJSONHandler(os.Stderr, nil) // JSON 格式的日志处理器
    myslog := slog.New(jsonHandler) // 创建一个结构化日志记录器

    // 记录一条信息级别日志，内容是“hi there”，以 JSON 格式输出到 stderr
    myslog.Info("hi there")

    // 记录一条带有键值对的结构化日志：消息为“hello again”，附加数据为 key=val 和 age=25
    myslog.Info("hello again", "key", "val", "age", 25)
}
